package com.moyun.common.event.dict.concretehandler;

import cn.hutool.cache.CacheUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import com.moyun.common.cache.dict.DictDataCache;
import com.moyun.common.event.dict.handler.AbstractDictHandler;
import com.moyun.model.vo.system.DictItemOptions;
import com.moyun.common.event.dict.DictHandlerAware;
import com.moyun.common.event.dict.concretehandler.dictitem.IDictItemHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 功能描述: 字典表 加载
 * 即 数据库中 字典类型表 和 字典数据表 的内容
 * <br/>
 */
@Component
public class DictItemHandler extends AbstractDictHandler {

    @Autowired
    private DictHandlerAware dictHandlerAware;

    public DictItemHandler() {
        cacheData = CacheUtil.newFIFOCache(10000);
    }

    @Override
    public void loadDictCache() {
        // 初始化字典缓存
        getDictDataHandler().initDictCache(DictDataCache.getTypeList(), cacheData);
    }

    @Override
    public void reloadDictCache(String typeCode) {
        /**
         *  1. 首先移除 缓存中 旧的 字典表数据 lg: typeCode=sex  dataLabel=男 dataValue=1
         *                                                  dataLabel=女 dataValue=2
         */
        remove(typeCode);
        /**
         *  2. 从数据库表中 查询出 最新的 字典项 数据 存入到缓存中 lg: typeCode=sex  dataLabel=男 dataValue=2
         *                                                                   dataLabel=女 dataValue=1
         */
        List<DictItemOptions> dictItemList = getDictDataHandler().getDictItemOptions(typeCode);
        if(CollUtil.isNotEmpty(dictItemList)) {
            put(typeCode, dictItemList);
        }
    }

    @Override
    public List<DictItemOptions> getDictItemOptions(String typeCode) {
        List<DictItemOptions> dictDataOptions = cacheData.get(typeCode);
        // 如果缓存中不存在，则说明可能失效了，再次从数据库中查询
        if(CollUtil.isEmpty(dictDataOptions)) {
            // 从数据库中 获取 typeCode 对应的字典项列表
            List<DictItemOptions> dictItemList = getDictDataHandler().getDictItemOptions(typeCode);
            if(CollUtil.isEmpty(dictItemList)) {
                put(typeCode, dictItemList);
            } else {
                return ListUtil.empty();
            }
        }
        return cacheData.get(typeCode);
    }

    private IDictItemHandler getDictDataHandler() {
        return dictHandlerAware.getDictHandler();
    }

}
